﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using vudu.Presentacion.Contrato.VU_10_Consultar_Horarios_de_Materia_e_Imprimir;
using vudu.Logica.Fachada;
using vudu.ClasesDominio;
using System.Data;
using System.Web.UI.WebControls;

namespace vudu.Presentacion.Presentador.VU_10_Consultar_Horarios_de_Materia_e_Imprimir
{
    public class PresentadorConsultarHorario
    {
        private EnlaceLogico _fachada;
        private IContratoConsultarHorario _vista;
        private Profesor _prof;


        public PresentadorConsultarHorario(EnlaceLogico fachada,IContratoConsultarHorario vista) {
            _vista = vista;         
            _fachada = fachada;    

        }

        //si es un estudiante aqui se encarga de llenar las listas de materias de practicas del estudiante
        //y se llena el gridview con esos datos
        public void ConsultarMateriasDeUnEstudiante()
        {

            Estudiante _est = new Estudiante();
            List<SeccionMateria> listaMaterias = new List<SeccionMateria>();
            List<Practica> listaPracticas = new List<Practica>();
            _est = (Estudiante)_fachada.RolActual; 
            int estudiante;
            estudiante = _est.IdEst;
            int columna;
            _vista.Usuario.Text = "Alumno(a): " + _est.Nombre + _est.Apellido; 
                listaMaterias = _fachada.MateriasEstudianteHorario(estudiante);
                listaPracticas = _fachada.PracticasEstudianteHorario(estudiante);
            if  (listaMaterias.Count == 0 && listaPracticas.Count == 0){
                _vista.MensajeError.Text = "Este Alumno(a) no posee materias asignadas ";

                 }else{
           
                llenarGridView(listaMaterias,listaPracticas);
                columna = 4;
                ponerInvisibleColumnaCodigo(columna);
                columna = 6;
                ponerInvisibleColumnaCodigo(columna);
             }
        }

        //si es profesor aqui se encarga de llenar las listas de materias y practicas del profesor
        //y se llena el gridview de profesor
        public void ConsultarMateriasDeUnProfesor()
        {
            int profesor;
            int columna;
            _prof = (Profesor)_fachada.RolActual;
            profesor = _prof.Crn;

            List<SeccionMateria> listaMaterias = new List<SeccionMateria>();
            List<Practica> listaPracticas = new List<Practica>();
            _vista.Usuario.Text = "Profesor(a): " + _prof.Nombre + _prof.Apellido; 
            listaMaterias = _fachada.MateriasProfesorHorario(profesor);
            listaPracticas = _fachada.MateriasPracticaProfesor(profesor);
            if  (listaMaterias.Count == 0 && listaPracticas.Count == 0){
                _vista.MensajeError.Text = "Este Profesor(a) no posee materias asignadas ";

            }else{
                llenarGridViewProfesor(listaMaterias, listaPracticas);
                columna = 3;
                ponerInvisibleColumnaCodigo(columna);
                columna = 5;
                ponerInvisibleColumnaCodigo(columna);
            }   
        }

        //aqui se llena el gridview del estudiante 
        public void llenarGridView(List<SeccionMateria> misMaterias,List<Practica> misPracticas)
        {
            DataTable tablaMateria = new DataTable();
            String Tipo = null; 
            tablaMateria.Columns.Add("Materia", typeof(string));
            tablaMateria.Columns.Add("Seccion", typeof(int));
            tablaMateria.Columns.Add("Profesor", typeof(string));   
            tablaMateria.Columns.Add("IdSeccion", typeof(int));
            tablaMateria.Columns.Add("Horario", typeof(string));
            tablaMateria.Columns.Add("Tipo", typeof(string));
            String horario = null;
            
            //llena las horas de la teoria
            for (int indiceMateria = 0; indiceMateria < misMaterias.Count; indiceMateria++)
            {
                Tipo = "Teoria";
                List<HorarioDeClase> listaHorario = new List<HorarioDeClase>();
                listaHorario = _fachada.HorarioDeMateria(misMaterias[indiceMateria]);
                
                for (int indiceHorario = 0; indiceHorario < listaHorario.Count; indiceHorario++)
                {
                    horario += Convert.ToString(listaHorario[indiceHorario].Dia + " " +
                                                listaHorario[indiceHorario].HoraInicio.Hour + ":" + "00" + " " +
                                                listaHorario[indiceHorario].HoraFin.Hour + ":" + "00" + " - " +
                                                listaHorario[indiceHorario].SalonDeClase.Nombre);
                }
                tablaMateria.Rows.Add(misMaterias[indiceMateria].Materia.Nombre, 
                                      misMaterias[indiceMateria].Codigo,
                                      misMaterias[indiceMateria].Profesor.Nombre+" "+
                                      misMaterias[indiceMateria].Profesor.Apellido,
                                      misMaterias[indiceMateria].IdSeccionMateria,
                                      horario,Tipo);
                horario = "";
                 
            }

            //llena las horas de practica
            for (int indicePractica = 0; indicePractica < misPracticas.Count; indicePractica++)
            {
                Tipo = "Practica";
                List<HorarioDeClase> listaHorarioPractica = new List<HorarioDeClase>();
                listaHorarioPractica = _fachada.HorarioDePractica(misPracticas[indicePractica]);

                for (int indiceHorario = 0; indiceHorario < listaHorarioPractica.Count; indiceHorario++)
                {
                    horario += Convert.ToString(listaHorarioPractica[indiceHorario].Dia + " " +
                                                listaHorarioPractica[indiceHorario].HoraInicio.Hour + ":" + "00" + " " +
                                                listaHorarioPractica[indiceHorario].HoraFin.Hour + ":" + "00" + " - " +
                                                listaHorarioPractica[indiceHorario].SalonDeClase.Nombre);
                }

                tablaMateria.Rows.Add(misPracticas[indicePractica].NombrePractica,
                                      misPracticas[indicePractica].NumeroSeccion,
                                      misPracticas[indicePractica].profesor.Nombre +" "+
                                      misPracticas[indicePractica].profesor.Apellido,
                                      misPracticas[indicePractica].IdPractica,
                                      horario,Tipo);
                horario = "";

            }

           

            _vista.ConsultarHorarioImprimir.DataSource =tablaMateria;
            _vista.ConsultarHorarioImprimir.DataBind();
        }

        //llena el gridview del profesor 
        public void llenarGridViewProfesor(List<SeccionMateria> misMaterias, List<Practica> misPracticas)
        {
            DataTable tablaMateria = new DataTable();
            String Tipo = null; 
            tablaMateria.Columns.Add("Materia", typeof(string));
            tablaMateria.Columns.Add("Seccion", typeof(int));
            tablaMateria.Columns.Add("IdSeccion", typeof(int));
            tablaMateria.Columns.Add("Horario", typeof(string));
            tablaMateria.Columns.Add("Tipo", typeof(string));
            String horario = null;
            
            //llenar las horas de teoria
            for (int indiceMateria = 0; indiceMateria < misMaterias.Count; indiceMateria++)
            {
                Tipo = "Teoria";
               List<HorarioDeClase> listaHorario = new List<HorarioDeClase>();
               listaHorario = _fachada.HorarioDeMateriaProfesor(misMaterias[indiceMateria]);

               for (int indiceHorario = 0; indiceHorario < listaHorario.Count; indiceHorario++)
               {
                    horario += Convert.ToString(listaHorario[indiceHorario].Dia + " " +
                                                listaHorario[indiceHorario].HoraInicio.Hour + ":" + "00" + " " +
                                                listaHorario[indiceHorario].HoraFin.Hour + ":" + "00" + " - " +
                                                listaHorario[indiceHorario].SalonDeClase.Nombre);
               }
                tablaMateria.Rows.Add(misMaterias[indiceMateria].Materia.Nombre,
                                      misMaterias[indiceMateria].Codigo,
                                      misMaterias[indiceMateria].IdSeccionMateria,
                                      horario,Tipo);
                horario = "";

            }

            //llenar las practicas
            for (int indicePractica = 0; indicePractica < misPracticas.Count; indicePractica++)
            {
                Tipo = "Practica";
                List<HorarioDeClase> listaHorario = new List<HorarioDeClase>();
                listaHorario = _fachada.HorarioDePracticaProfesor(misPracticas[indicePractica]);

                for (int indiceHorario = 0; indiceHorario < listaHorario.Count; indiceHorario++)
                {
                    horario += Convert.ToString(listaHorario[indiceHorario].Dia + " " +
                                                listaHorario[indiceHorario].HoraInicio.Hour + ":" + "00" + " " +
                                               listaHorario[indiceHorario].HoraFin.Hour + ":" + "00" + " - " +
                                                listaHorario[indiceHorario].SalonDeClase.Nombre);
                }
                tablaMateria.Rows.Add(misPracticas[indicePractica].NombrePractica,
                                      misPracticas[indicePractica].NumeroSeccion,
                                      misPracticas[indicePractica].IdPractica,
                                      horario, Tipo);
                horario = "";

            }


            _vista.ConsultarHorarioImprimir.DataSource = tablaMateria;
            _vista.ConsultarHorarioImprimir.DataBind();
        }

        //pone invisible varias columnas de datos que se estan usando para procesos internos
         public void ponerInvisibleColumnaCodigo(int columna)
        {
            _vista.ConsultarHorarioImprimir.HeaderRow.Cells[columna].Visible = false;
            foreach (GridViewRow row in _vista.ConsultarHorarioImprimir.Rows)
            {
                row.Cells[columna].Visible = false;
            }
        }

    }
}